package com.uniflow.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uniflow.entity.Form;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 表单Mapper接口
 */
@Mapper
public interface FormMapper extends BaseMapper<Form> {
    
    /**
     * 分页查询表单列表（包含使用统计）
     */
    IPage<Form> selectFormPage(Page<Form> page, 
                               @Param("keyword") String keyword,
                               @Param("category") String category,
                               @Param("published") Boolean published,
                               @Param("enabled") Boolean enabled,
                               @Param("createdBy") String createdBy);
    
    /**
     * 根据名称查询表单（排除指定ID）
     */
    Form selectByName(@Param("name") String name, @Param("excludeId") String excludeId);
    
    /**
     * 根据分类查询表单列表
     */
    List<Form> selectByCategory(@Param("category") String category);
    
    /**
     * 查询已发布的表单列表
     */
    List<Form> selectPublishedForms();
    
    /**
     * 查询表单分类列表
     */
    List<String> selectCategories();
    
    /**
     * 更新表单发布状态
     */
    int updatePublishStatus(@Param("id") String id, 
                           @Param("published") Boolean published,
                           @Param("updatedBy") String updatedBy,
                           @Param("updatedByName") String updatedByName);
    
    /**
     * 更新表单启用状态
     */
    int updateEnabledStatus(@Param("id") String id, 
                           @Param("enabled") Boolean enabled,
                           @Param("updatedBy") String updatedBy,
                           @Param("updatedByName") String updatedByName);
    
    /**
     * 批量更新表单排序
     */
    int batchUpdateSortOrder(@Param("forms") List<Form> forms);
    
    /**
     * 复制表单
     */
    int copyForm(@Param("sourceId") String sourceId,
                 @Param("newId") String newId,
                 @Param("newName") String newName,
                 @Param("newTitle") String newTitle,
                 @Param("createdBy") String createdBy,
                 @Param("createdByName") String createdByName);
    
    /**
     * 获取表单统计信息
     */
    Map<String, Object> getFormStatistics();
    
    /**
     * 获取表单使用统计
     */
    List<Map<String, Object>> getFormUsageStatistics(@Param("limit") Integer limit);
    
    /**
     * 根据创建人统计表单数量
     */
    List<Map<String, Object>> getFormCountByCreator();
    
    /**
     * 根据分类统计表单数量
     */
    List<Map<String, Object>> getFormCountByCategory();
    
    /**
     * 检查表单是否被使用
     */
    int checkFormUsage(@Param("formId") String formId);
    
    /**
     * 获取最大排序值
     */
    Integer getMaxSortOrder();
    
    /**
     * 根据外部ID查询表单
     */
    Form selectByExternalId(@Param("externalId") String externalId);
    
    /**
     * 更新表单版本
     */
    int incrementVersion(@Param("id") String id,
                        @Param("updatedBy") String updatedBy,
                        @Param("updatedByName") String updatedByName);
}